/**
 * 
 */
package com.ia.neuralNetwork;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;

/**
 * @author sami
 * 
 */
public class Pattern {

	/**
	 * 
	 */
	
	private static neuralNetwork nn = new neuralNetwork();
	private static String[] patrones;
	
	public Pattern(String file) {
		
		try {
			String p[] = loadFilePattern(file);
			if ( p!=null) {
				this.setPatrones(p);
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	public String[] getPatrones() {
		
		if ( patrones!=null && patrones.length>0){
			return patrones;
		} else { 
			return null;
		}
	}
	
	public void setPatrones(String[] z) {
		patrones = z;
	}

	public int getNumeroPatrones() {
		
		if ( patrones!=null) {
			return patrones.length;
		} else {
			return 0;
		}
	}
	
	public String[] loadFilePattern(String fichero)
			throws FileNotFoundException, IOException {

		String[] pt = null;
		
		
		String sFichero = fichero;
		File existefichero = new File(sFichero);
		
		if (existefichero.exists()) {
		
			File archivo = null;
			FileReader fr = null;
			BufferedReader br = null;
	
			try {
				// Apertura del fichero y creacion de BufferedReader para poder
				// hacer una lectura comoda (disponer del metodo readLine()).
				archivo = new File(sFichero);
				fr = new FileReader(archivo);
				br = new BufferedReader(fr);
	
				String l = "";
	
				l = br.readLine();
	
				// fr.close();
	
				// Lectura del fichero*/
				String linea = "";
	
				String s = "";
	
				s = l + ":";
				while ((linea = br.readLine()) != null) {
					s = s + linea + ":";
				}
	
				pt = s.split(":");
				
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				// En el finally cerramos el fichero, para asegurarnos
				// que se cierra tanto si todo va bien como si salta
				// una excepcion.
				try {
					if (null != fr) {
						fr.close();
					}
				} catch (Exception e2) {
					e2.printStackTrace();
				}
			}
		} else {
			System.out.println("el fichero de patrones no existe");	
		}
		
		
		return pt;

	}
	
	public String isPatternValid(String p) {

		String pp[] = new String[0];
		String resultado = "";

		int indice1 = nn.getNeuronasEntrada() * 2;

		pp = this.getPatrones();

		if (this.getNumeroPatrones() > 0) {

			if (pp != null && pp.length > 0 && !pp.equals("null")) {

				Arrays.sort(pp);

				for (int x = 0; x < pp.length; x++) {

					if (!pp[x].equals("null") && pp[x] != null) {

						// System.out.println("IGUALES "+pp[x]);

						if (p.equals(pp[x])) {
							resultado = "1";
						} else {
							String p1 = p.substring(0, indice1);
							String p2 = pp[x].substring(0, indice1);

							if (p1.equals(p2)) {
								resultado = "2";
							}
						}

					}
				}

			}
			if (resultado == "") {
				pp = insertElement(pp, p, pp.length);
				this.setPatrones(pp);
			}
		}

		return resultado;
	}
	
	protected static String[] insertElement(String original[], String element,
			int index) {
		int length = original.length;
		String destination[] = new String[length + 1];
		System.arraycopy(original, 0, destination, 0, index);
		destination[index] = element;
		System.arraycopy(original, index, destination, index + 1, length
				- index);
		return destination;
	}
	
	
	public void savePattern(String path, String nombrefichero, String patron) {

		// Validamos si existe el fichero
		String sFichero = path + nombrefichero;

		File fichero = new File(sFichero);

		if (fichero.exists()) {
			try {
				BufferedWriter bw = new BufferedWriter(new FileWriter(sFichero,
						true));

				bw.write(patron + "\n");

				// Hay que cerrar el fichero
				bw.close();
			} catch (IOException ioe) {
				ioe.printStackTrace();
			}
		} else {
			
			File crearFichero = new File (sFichero);
			 try {
				if (crearFichero.createNewFile()) {
					 savePattern(path, nombrefichero, patron);
				 }
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
				   
			
		}
	}

}
